package com.zenithmind.mall.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.mall.pojo.dto.ProductReviewDTO;
import com.zenithmind.mall.pojo.entity.ProductReview;
import com.zenithmind.mall.pojo.query.ProductReviewQuery;
import com.zenithmind.mall.pojo.vo.ProductReviewVO;
import com.zenithmind.mall.pojo.vo.ReviewStatisticsVO;

import java.util.List;

/**
 * 商品评价服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-06-09
 */
public interface ProductReviewService extends IService<ProductReview> {

    /**
     * 分页查询商品评价
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<ProductReviewVO> getReviewPage(ProductReviewQuery query);

    /**
     * 根据ID获取评价详情
     * 
     * @param id 评价ID
     * @return 评价详情
     */
    ProductReviewVO getReviewById(String id);

    /**
     * 创建商品评价
     * 
     * @param reviewDTO 评价DTO
     * @param userId 用户ID
     * @return 评价ID
     */
    String createReview(ProductReviewDTO reviewDTO, String userId);

    /**
     * 更新商品评价
     * 
     * @param id 评价ID
     * @param reviewDTO 评价DTO
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean updateReview(String id, ProductReviewDTO reviewDTO, String userId);

    /**
     * 删除商品评价
     * 
     * @param id 评价ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean deleteReview(String id, String userId);

    /**
     * 批量删除商品评价
     * 
     * @param ids 评价ID列表
     * @return 是否成功
     */
    Boolean deleteReviewsBatch(List<String> ids);

    /**
     * 获取商品评价列表
     * 
     * @param productId 商品ID
     * @param rating 评分筛选
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 评价列表
     */
    PageResult<ProductReviewVO> getProductReviews(String productId, Integer rating, Integer pageNum, Integer pageSize);

    /**
     * 获取用户评价列表
     * 
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 评价列表
     */
    PageResult<ProductReviewVO> getUserReviews(String userId, Integer pageNum, Integer pageSize);

    /**
     * 获取商品评价统计
     * 
     * @param productId 商品ID
     * @return 评价统计
     */
    ReviewStatisticsVO getReviewStatistics(String productId);

    /**
     * 点赞评价
     * 
     * @param reviewId 评价ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean likeReview(String reviewId, String userId);

    /**
     * 取消点赞评价
     * 
     * @param reviewId 评价ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean unlikeReview(String reviewId, String userId);

    /**
     * 回复评价
     * 
     * @param reviewId 评价ID
     * @param replyContent 回复内容
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean replyReview(String reviewId, String replyContent, String userId);

    /**
     * 检查用户是否可以评价商品
     * 
     * @param userId 用户ID
     * @param productId 商品ID
     * @param orderId 订单ID
     * @return 是否可以评价
     */
    Boolean canUserReview(String userId, String productId, String orderId);

    /**
     * 获取热门评价
     * 
     * @param productId 商品ID
     * @param limit 限制数量
     * @return 热门评价列表
     */
    List<ProductReviewVO> getHotReviews(String productId, Integer limit);

    /**
     * 审核评价
     * 
     * @param id 评价ID
     * @param status 审核状态
     * @param auditRemark 审核备注
     * @return 是否成功
     */
    Boolean auditReview(String id, Integer status, String auditRemark);

    /**
     * 获取待审核评价数量
     * 
     * @return 待审核数量
     */
    Long getPendingAuditCount();
}
